package com.mj.listen2._03_图;

/**
 * 图，接口
 */
public interface Graph<V, E> {
    int edgeSize();// 边的数量

    int verticesSize();// 定点数量

    // 图内部不暴露给外面节点，只暴露值，在内部值V对应图内部的一个节点对象
    void addVertex(V v);// 添加一个定点

    void addEdge(V from, V to);// 添加边，不带权值

    void addEdge(V from, V to, E weight);// 添加边，带权值

    void removeVertex(V v);// 删除顶点

    void removeEdge(V from, V to);// 删除边

    /**
     * 图的广度(宽度)优先搜索
     *
     * @param begin 从哪个点开始进行广度优选搜索
     */
    void bfs(V begin, VertexVisitor<V> visitor);

    /**
     * 图的深度优先搜索
     *
     * @param begin 从哪个点开始进行深度优选搜索
     */
    void dfs(V begin, VertexVisitor<V> visitor);

    interface VertexVisitor<V> {
        boolean visit(V v);
    }
}
